const util = {
    /* 数组转为树形数组 */
    convertToTreeData(jsonData, id = 'id', pid = 'pid') {
        // jsonData: 数组对象
        // id: 每条数据的id
        // pid: 每条数据的父节点对应字段
        const result = []
        const temp = {}
        for (let i = 0; i < jsonData.length; i++) {
            temp[jsonData[i][id]] = jsonData[i] // 以id作为索引存储元素，可以无需遍历直接定位元素
        }
        for (let j = 0; j < jsonData.length; j++) {
            const currentElement = jsonData[j]
            const tempCurrentElementParent = temp[currentElement[pid]] // 临时变量里面的当前元素的父元素
            if (tempCurrentElementParent) {
                // 如果存在父元素
                if (!tempCurrentElementParent['children']) {
                    // 如果父元素没有chindren键
                    tempCurrentElementParent['children'] = [] // 设上父元素的children键
                }
                tempCurrentElementParent['children'].push(currentElement) // 给父元素加上当前元素作为子元素
            } else {
                // 不存在父元素，意味着当前元素是一级元素
                result.push(currentElement)
            }
        }
        return result
    },
    /* 树形数据-获取当前节点在内的所有父节点集合 */
    getParentArr(dataArr, rootNodeId, rootNodeKey = 'id', key = 'id', pkey = 'pid') {
        var arrRes = []
        if (dataArr.length === 0) {
            if (rootNodeId) {
                arrRes.unshift(dataArr)
            }
            return arrRes
        }
        const rev = (data, nodeId) => {
            for (var i = 0, length = data.length; i < length; i++) {
                const node = data[i]
                if (node[rootNodeKey] === nodeId) {
                    arrRes.unshift(node)
                    rev(dataArr, node[pkey])
                    break
                } else {
                    if (node.children) {
                        rev(node.children, nodeId)
                    }
                }
            }
            return arrRes
        }
        arrRes = rev(dataArr, rootNodeId)
        return arrRes
    },
    /* 树形数据-获取第一个节点在内的所有第一个子节点集合 */
    getFirstNodeChain(treeData) {
        const chains = []
        const getFirstNodeChain = (newTreeData) => {
            if (newTreeData.length > 0) {
                chains.push(newTreeData[0])
                if (newTreeData[0].children && newTreeData[0].children.length > 0) {
                    getFirstNodeChain(newTreeData[0].children)
                }
            }
        }
        getFirstNodeChain(treeData)
        return chains
    },
    downloadCommonFile(url, filename) {
        const link = document.createElement('a')
        link.style.display = 'none'
        link.href = url
        link.setAttribute('download', filename)
        document.body.appendChild(link)
        link.click()
    },
    /* 下载文件 */
    downloadFile(url, filename) {
        this.getBlob(url).then(blob => {
            this.saveAs(blob, filename)
        })
    },
    getBlob(url) {
        return new Promise(resolve => {
            const xhr = new XMLHttpRequest()
            xhr.open('GET', url, true)
            xhr.responseType = 'blob'
            xhr.onload = () => {
                if (xhr.status === 200) {
                    resolve(xhr.response)
                }
            }
            xhr.send()
        })
    },
    saveAs(blob, name) {
        if (window.navigator.msSaveOrOpenBlob) {
            navigator.msSaveOrOpenBlob(blob, name)
        } else if (window.navigator.msSaveOrBlob) {
            // IE10+下载
            navigator.msSaveOrBlob(blob, name)
        } else {
            const link = document.createElement('a')
            link.href = window.URL.createObjectURL(blob)
            link.download = name
            link.click()
        }
    },
    getUrlSearch(name) {
        // 未传参，返回空
        if (!name) return null
            // 查询参数：先通过search取值，如果取不到就通过hash来取
        var after = window.location.search
        after = after.substr(1) || window.location.hash.split('?')[1]
            // 地址栏URL没有查询参数，返回空
        if (!after) return null
            // 如果查询参数中没有"name"，返回空
        if (after.indexOf(name) === -1) return null

        var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)')
            // 当地址栏参数存在中文时，需要解码，不然会乱码
        var r = decodeURI(after).match(reg)
            // 如果url中"name"没有值，返回空
        if (!r) return null

        return r[2]
    }
}
export default util